package com.patterns.proxy.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * Created by Xiao Yiyun on 2017/4/23.
 * 动态代理
 * 客户端类
 */
public class Cilent {
    public static void main(String[] args) {
        //定义一个游戏玩家
        IGamePlayer player = new GamePlayer("pp");
        //定义一个handler，玩家的动态代理
        InvocationHandler handler = new GamePlayIH(player);
        //开始打游戏，记下时间戳
        System.out.println("开始时间：。。。。。。。。。");
        //获得类的class loader
        ClassLoader classLoader = player.getClass().getClassLoader();
        //动态产生一个代理对象
        //Proxy类的作用：
        //  用来动态创建一个代理对象的类
        //Proxy.newProxyInstance(
        // 1. classLoader对象，定义了由哪个ClassLoader对象来对生成的代理对象进行加载
        // 2. 一个Interface对象的数组，表示的是将要给需要代理的对象提供一组什么样的接口
        //    如果提供了一组接口给它，那么这个代理对象就宣称实现了该接口（多态），这样就
        //    能调用这组接口中的方法了
        //  3.一个InvocationHandler对象，表示的是当我这个动态代理对象在调用方法的时候，
        //    会关联到哪一个InvocationHandler对象上)
        //作用：得到一个动态的代理对象
        IGamePlayer proxy = (IGamePlayer) Proxy.newProxyInstance
                (classLoader, new Class[]{IGamePlayer.class}, handler);
        //登录
        proxy.login("xurui", "123");
        //杀怪
        proxy.killBoss();
        //升级
        proxy.upGrade();
        //记录游戏结束时间
        System.out.println("结束时间。。。。。。。。。。");
    }
}
